#include "intensitypedestrian.h"
#include "types.h"
#include <QGroupBox>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QSettings>
#include <QLabel>
#include <QComboBox>
#include <QDebug>

/**
@brief Jedyny konstruktor

Tworzy widgety (najpierw "statyczne" - których wartość i liczba się nie zmienia) i layouty.
Przypisuje wartość do numBranches (dla tej klasy) poprzzez wywołanie funkcji getNumBranchesFromSettings() . Ustawia layouty w odpowiedniej kolejności i dodaje Widgety "statyczne".
Tworzy "dynamiczne" widgety, których liczba jest zmienna w zależności od liczby gałęzi, przez wywołanie funkcji createDynamicWidgets() .
Czyta zapisane opcje natężenia pieszych (dla tej klasy tylko) wywołując funkcję readSettings().

*/
IntensityPedestrian::IntensityPedestrian(QWidget *parent) :
    QWidget(parent)
{
    _pedestrianGroupBox = new QGroupBox(tr("Piesi"));
    _mainLayout = new QVBoxLayout();
    _rightGridLayout = new QGridLayout();
    _numerNaglowekLabel = new QLabel(tr("Nr gałęzi")); //new QLabel(tr("Nr"));
    _natezenieNaglowekLabel = new QLabel(tr("Natężenie"));

    this->setLayout(_mainLayout);
    _mainLayout->addWidget(_pedestrianGroupBox);
    _pedestrianGroupBox->setLayout(_rightGridLayout);
    _rightGridLayout->addWidget(_numerNaglowekLabel, 0, 0, Qt::AlignCenter);
    _rightGridLayout->addWidget(_natezenieNaglowekLabel, 0, 1, Qt::AlignCenter);

    createDynamicWidgets();
    readSettings();
}

/*! Funkcja odczytuje liczbę gałęzi na rondzie z QSettings a następnie tworzę widgety:
etykiety numerujące gałęzie _numerGaleziLabelList oraz ComboBoxy _intensityComboBoxList zawierające informacje o natężeniu pieszych na rondzie .
Wywoływana w funkcje numBranchesChanged()
*/
void IntensityPedestrian::createDynamicWidgets(QString name)
{
    QSettings op("TabMar", name);
    int numBranches = op.value("numBranches", 2).toInt();
    op.beginReadArray("Branch");

//    qDebug() << "createDynamicWidgets start";
    for (int i = 0; i < numBranches; i++)
    {
        op.setArrayIndex(i);
        if (op.value("zebra", 2).toInt() != 0)
        {
            _numerGaleziLabelList.push_back( new QLabel ( QString::number(double(i)) ) );
            _intensityComboBoxList.push_back( new QComboBox() );
        }
    }
    op.endArray();
    int i=0;
    foreach (QComboBox *z, _intensityComboBoxList)
    {
        z->addItem(tr("Wcale"));
        z->addItem(tr("Rzadko"));
        z->addItem(tr("Średnio"));
        z->addItem(tr("Często"));
        z->addItem(tr("Strajk"));
        _rightGridLayout->addWidget(_numerGaleziLabelList.at(i), i+1, 0, Qt::AlignCenter);
        _rightGridLayout->addWidget(z, i+1, 1, Qt::AlignCenter);
        i++;
        connect(z, SIGNAL(currentIndexChanged(int)), this, SLOT(intensityIndexChanged()));
    }
    _mainLayout->addStretch();
}

/*! Funkcja jest wywoływana, gdy zostanie wysłany sygnał changeNumBranchesForTram(int) (zdefiniowany w konstruktorze
mainOptions. Wywołuje funkcje usuwające dynamiczne widgety deleteDynamicWidgets(), następnie tworzy nowe widgety wywołując funkcję
createDynamicWidgets() i odczytuje na koniec opcje (ustawia odpowiednie wartosci jeśli zostały zapisane) wywołując funkcję readSettings().
*/
void IntensityPedestrian::numBranchesChanged(QString name)
{
    deleteDynamicWidgets();
    createDynamicWidgets(name);
    readSettings(name);
}

/*! Funkcja usuwa wszystkie dynamiczne widgety: _numerGaleziLabelList oraz _intensityComboBoxList, które później są tworzone w funkcji createDynamicWidgets().
  Wywoływana w funkcji createDynamicWidgets().
*/
void IntensityPedestrian::deleteDynamicWidgets()
{
    foreach (QLabel * q, _numerGaleziLabelList)
        delete q;
    foreach (QComboBox * q, _intensityComboBoxList)
        delete q;
    _numerGaleziLabelList.clear();
    _intensityComboBoxList.clear();
}

/*! Funkcja zapisuje do QSettings: indeksy każdego ComboBoxa z _intensityComboBoxList oraz numer gałęzi mu odpowiadającej.
W QSettings klucz indeksu natężenia to intensityPedestrain, natomiast numer gałęzi mu odpowiadającej to numBranches.
Więcej informacji o zapisie do QSettings: \link stronaZapisOpcji \endlink.
Na koniec funkcji emitowany jest sygnał newIntensityPedestrian(), który jest odbierany w konstruktorze RSim::RSim(QWidget *parent).
*/
void IntensityPedestrian::saveSettings()
{
    foreach (QComboBox *z, _intensityComboBoxList)
    {
        disconnect(z, SIGNAL(currentIndexChanged(int)), this, SLOT(intensityIndexChanged()));
    }
    QSettings op("TabMar", "RoundaboutSimulator");
    removeGroupSettings("IntensityPedestrian");
    op.beginWriteArray("IntensityPedestrian");
    int i = 0;
    foreach (QLabel *q, _numerGaleziLabelList)
    {
        op.setArrayIndex(i);
        op.setValue("numBranches", q->text() );
        i++;
    }
    i=0;
    foreach (QComboBox *q, _intensityComboBoxList)
    {
        op.setArrayIndex(i);
        op.setValue("intensityPedestrian", q->currentIndex() );
        i++;
    }
    op.endArray();
    foreach (QComboBox *z, _intensityComboBoxList)
    {
        connect(z, SIGNAL(currentIndexChanged(int)), this, SLOT(intensityIndexChanged()));
    }
    emit newIntensityPedestrian();

}

/*! Funkcja odczytuje z QSettings: indeksy każdego ComboBoxa z _intensityComboBoxList oraz numer gałęzi mu odpowiadającej za pomocą odpowiednio kluczy: intensityPedestrian oraz numBranches
Odczytane wartości są przypisywane do odpowidających mu zmiennych. Jeśli rozmiar zapisanych opcji jest różny od liczby widgetów to funkcja nic nie robi i zwraca -1.
Jeśli odczytanie się powiodło to zwraca 0.
Więcej informacji oo zapisie i odczycie do QSettings: \link stronaZapisOpcji \endlink.
*/
int IntensityPedestrian::readSettings(QString name)
{
    //qDebug() << "odczytuje readSettings w intensityPedestian";
    QSettings op("TabMar", name);
    int i = 0;
    int size = op.beginReadArray("IntensityPedestrian");
    if ( size != _intensityComboBoxList.size() )//jesli rozmiar opcji zapisanych jest różny od ilości widgetów to nie czytaj (to jest prawda tylko na początku działania programu, czyli wtedy gdy chcę)
        return (-1);

    foreach (QComboBox *z, _intensityComboBoxList)
    {
        disconnect(z, SIGNAL(currentIndexChanged(int)), this, SLOT(intensityIndexChanged()));
    }

    foreach (QLabel *q, _numerGaleziLabelList)
    {
        op.setArrayIndex(i);
        q->setText(op.value("numBranches", "1").toString());
        i++;
    }
    i=0;
    foreach (QComboBox *q, _intensityComboBoxList)//tutaj jest problem ponieważ odczytywana z opcji wartość to nie 1,2,3,4,5 a 0, 10, 20, 50, 100 - dlatego działa tylko dla 0 a pozostałych nie ustawia
    {
        op.setArrayIndex(i);
        q->setCurrentIndex(op.value("intensityPedestrian", 0).toInt());
        i++;
    }
    op.endArray();
    foreach (QComboBox *z, _intensityComboBoxList)
    {
        connect(z, SIGNAL(currentIndexChanged(int)), this, SLOT(intensityIndexChanged()));
    }
    return 0;
}

/*! Slot wywołujący funkcję saveSettings.
Jest wywoływany za każdym razem, gdy w dowolnym elemencie listy _intensityComboBoxList zmieni się indeks.
  */
void IntensityPedestrian::intensityIndexChanged()
{
    saveSettings();
}
